/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
 */
(function(a) {
	var c = (a.browser.msie ? "paste" : "input") + ".mask";
	var b = (window.orientation != undefined);
	a.mask = {
		definitions : {
			"9" : "[0-9]",
			a : "[A-Za-z]",
			"*" : "[A-Za-z0-9]"
		}
	};
	a.fn.extend( {
		caret : function(e, f) {
			if (this.length == 0) {
				return
			}
			if (typeof e == "number") {
				f = (typeof f == "number") ? f : e;
				return this.each(function() {
					if (this.setSelectionRange) {
						this.focus();
						this.setSelectionRange(e, f)
					} else {
						if (this.createTextRange) {
							var g = this.createTextRange();
							g.collapse(true);
							g.moveEnd("character", f);
							g.moveStart("character", e);
							g.select()
						}
					}
				})
			} else {
				if (this[0].setSelectionRange) {
					e = this[0].selectionStart;
					f = this[0].selectionEnd
				} else {
					if (document.selection && document.selection.createRange) {
						var d = document.selection.createRange();
						e = 0 - d.duplicate().moveStart("character", -100000);
						f = e + d.text.length
					}
				}
				return {
					begin : e,
					end : f
				}
			}
		},
		unmask : function() {
			return this.trigger("unmask")
		},
		mask : function(j, d) {
			if (!j && this.length > 0) {
				var f = a(this[0]);
				var g = f.data("tests");
				return a.map(f.data("buffer"), function(l, m) {
					return g[m] ? l : null
				}).join("")
			}
			d = a.extend( {
				placeholder : "_",
				completed : null
			}, d);
			var k = a.mask.definitions;
			var g = [];
			var e = j.length;
			var i = null;
			var h = j.length;
			a.each(j.split(""), function(m, l) {
				if (l == "?") {
					h--;
					e = m
				} else {
					if (k[l]) {
						g.push(new RegExp(k[l]));
						if (i == null) {
							i = g.length - 1
						}
					} else {
						g.push(null)
					}
				}
			});
			return this.each(function() {
				var r = a(this);
				var m = a.map(j.split(""), function(x, y) {
					if (x != "?") {
						return k[x] ? d.placeholder : x
					}
				});
				var n = false;
				var q = r.val();
				r.data("buffer", m).data("tests", g);
				function v(x) {
					while (++x <= h && !g[x]) {
					}
					return x
				}
				function t(x) {
					while (!g[x] && --x >= 0) {
					}
					for ( var y = x; y < h; y++) {
						if (g[y]) {
							m[y] = d.placeholder;
							var z = v(y);
							if (z < h && g[y].test(m[z])) {
								m[y] = m[z]
							} else {
								break
							}
						}
					}
					s();
					r.caret(Math.max(i, x))
				}
				function u(y) {
					for ( var A = y, z = d.placeholder; A < h; A++) {
						if (g[A]) {
							var B = v(A);
							var x = m[A];
							m[A] = z;
							if (B < h && g[B].test(x)) {
								z = x
							} else {
								break
							}
						}
					}
				}
				function l(y) {
					var x = a(this).caret();
					var z = y.keyCode;
					n = (z < 16 || (z > 16 && z < 32) || (z > 32 && z < 41));
					if ((x.begin - x.end) != 0 && (!n || z == 8 || z == 46)) {
						w(x.begin, x.end)
					}
					if (z == 8 || z == 46 || (b && z == 127)) {
						t(x.begin + (z == 46 ? 0 : -1));
						return false
					} else {
						if (z == 27) {
							r.val(q);
							r.caret(0, p());
							return false
						}
					}
				}
				function o(B) {
					if (n) {
						n = false;
						return (B.keyCode == 8) ? false : null
					}
					B = B || window.event;
					var C = B.charCode || B.keyCode || B.which;
					var z = a(this).caret();
					if (B.ctrlKey || B.altKey || B.metaKey) {
						return true
					} else {
						if ((C >= 32 && C <= 125) || C > 186) {
							var x = v(z.begin - 1);
							if (x < h) {
								var A = String.fromCharCode(C);
								if (g[x].test(A)) {
									u(x);
									m[x] = A;
									s();
									var y = v(x);
									a(this).caret(y);
									if (d.completed && y == h) {
										d.completed.call(r)
									}
								}
							}
						}
					}
					return false
				}
				function w(x, y) {
					for ( var z = x; z < y && z < h; z++) {
						if (g[z]) {
							m[z] = d.placeholder
						}
					}
				}
				function s() {
					return r.val(m.join("")).val()
				}
				function p(y) {
					var z = r.val();
					var C = -1;
					for ( var B = 0, x = 0; B < h; B++) {
						if (g[B]) {
							m[B] = d.placeholder;
							while (x++ < z.length) {
								var A = z.charAt(x - 1);
								if (g[B].test(A)) {
									m[B] = A;
									C = B;
									break
								}
							}
							if (x > z.length) {
								break
							}
						} else {
							if (m[B] == z[x] && B != e) {
								x++;
								C = B
							}
						}
					}
					if (!y && C + 1 < e) {
						r.val("");
						w(0, h)
					} else {
						if (y || C + 1 >= e) {
							s();
							if (!y) {
								r.val(r.val().substring(0, C + 1))
							}
						}
					}
					return (e ? B : i)
				}
				if (!r.attr("readonly")) {
					r.one(
							"unmask",
							function() {
								r.unbind(".mask").removeData("buffer")
										.removeData("tests")
							}).bind("focus.mask", function() {
						q = r.val();
						var x = p();
						s();
						setTimeout(function() {
							if (x == j.length) {
								r.caret(0, x)
							} else {
								r.caret(x)
							}
						}, 0)
					}).bind("blur.mask", function() {
						p();
						if (r.val() != q) {
							r.change()
						}
					}).bind("keydown.mask", l).bind("keypress.mask", o).bind(c,
							function() {
								setTimeout(function() {
									r.caret(p(true))
								}, 0)
							})
				}
				p()
			})
		}
	})
})(jQuery);